workflow (DDD)
DDDと書いているが、『Domain Modeling Made Functional』.iconでしか見たことがないmrsekut.icon
DMMFでは、1つのworkflowは、1つの関数で実装される
workflowはsubstepのチェーンとして表現される
substep毎に状態が更新されることもある
どういう実装になるか?
序盤
外部からの入力(DTO)を、validateしながらDomain Objectに変換
中盤
Domain Objectを使ってやりたかったことをやるコアロジック
終盤
つまり、処理済みのDomain ObjectをDTO形式でのEventに変換する
privateな情報が漏れ出ていないかを気をつけながらDTOに変換する
code:ts
export const placeOrderWorkflow = (
command: PlaceOrderDTO,
): Effect.Effect<PlaceOrderResult, ParseError, OrderEventQueue> =>
Effect.gen(function* () {
// 序盤: 検証
const order = yield* fromDTO(command);
// 中盤&終盤: ワークフロー実行とevent生成
const result = yield* placeOrderCore(order);
// イベントをキューに送信
const queue = yield* OrderEventQueue;
yield* Effect.all(result.events.map(e => Queue.offer(queue, e)));
yield* Effect.log(Order placed: ${result.order.orderId});
return result;
});
参考